<?php
namespace app\api\controller;
class Weixinlogs extends Common{
	/**
	 * 增加用户聊天记录(参考 model('Weixinlogs')->wxMsgInfosEnd())
	 */
	function add(){
		$post=input('wxInfos/a',[]);
		if(isset($post[0])){
			if(is_string($post[0])){
				$post=json_decode($post[0],true);
			}
		}
		//p($post);
		if(empty($post)){
			return json('数据不完整',1);
		}
		$uid=$this->user['id'];
		$dev_id=$this->user['device_id'];
		$data=[];
		$social=[];
		$ids=[]; // 好友ID组
		if(is_integer(key($post))){
			foreach ($post as $v) {
				$item=[
					'member_id'=>$uid,
					'dev_id'=>$dev_id,
					'send_time'=>$this->wxDateFormat($v['time']),
					'content'=>$v['content'],
					'soft_id'=>$v['soft_id'],
					'type'=>$v['type'],
					'unread'=>1,
				];
				if(!isset($v['social'])){
					$v['social']='';
				}
				// 首次循环未查找好友 或 不同的好友 或 不同的微信号下的相同好友 或 不同的群
				if(empty($social)||(!empty($social['number'])&&$social['number']!=$v['social'])||$social['soft_id']!=$v['soft_id']||(empty($social['number'])&&$v['nickname']!=$social['name'])){
					$social=$this->getSocial($v['social'],$v['soft_id'],$v['nickname'],$dev_id);

				}
				$item['social_id']=$social['id'];
				array_push($data,$item);
				$key=$v['soft_id'].'_'.$social['id'];
				if(in_array($key, $ids)){
					$ids[$key]++;
				}else{
					$ids[$key]=1;
				}
			}
		}
		if(!empty($data)){
			$add=model($this->table)->add($data);
			if(empty($add)){
				return json('添加失败',1);
			}
			
			// 聊天组件 用户未读信息
			$unreadIds=model('weixinlogs')->unreadIds($uid);
			$data=[
				'event'=>'wx_message',
				'data'=>$unreadIds,
			];
			\socket\Socket::admin($data,$uid);
			// 向移动端传递总的未读信息数
			$counts=0;
			foreach ($unreadIds as $v) {
				$counts+=$v;
			}
			$data=[
				'event'=>'wx_message_counts',
				'data'=>$counts,
			];
			\socket\Socket::admin($data,$uid);
			return json('添加成功');
		}
		return json('数据不完整',1);
	}
	/**
	 * 消息发送成功回馈接口
	 * @return 
	 */
	function sent(){
		$ids=input('ids/a',[]);
		if(!empty($ids)){
			$uid=$this->user['id'];
			$dev_id=$this->user['device_id'];
			$where=[
				'member_id'=>$uid,
				'dev_id'=>$dev_id,
				'is_me'=>1,
				'id'=>['id','in',$ids],
			];
			$edit=model($this->table)->edit(['send_status'=>2],$where);
			if($edit){
				return json('消息发送成功');
			}else{
				return json('',1);
			}
		}
		return json('数据不完整',1);
	}
	/**
	 * 验证是否存在该微信好友（不存在则新增）
	 * 昵称改变则更新昵称
	 * @param  [type] $number   好友微信号
	 * @param  [type] $soft_id  该好友所属账号ID
	 * @param  [type] $nickname 好友昵称
	 * @return array
	 */
	private function getSocial($number,$soft_id,$nickname,$dev_id){
		$uid=$this->user['id'];
		$where=[
			'member_id'=>$uid,
			'soft_id'=>$soft_id,
			'type'=>0,
		];
		if(empty($number)){ //群
			$where['name']=$nickname;
			$where['type']=1;
		}else{
			$where['number']=$number;
		}
		$has=model('social')->read($where,'id,member_id,soft_id,number,name');
		if(empty($has)){
			$where['s_time']=time();
			$where['nickname']=$nickname;
			$where['name']=$nickname;
			$has=model('social')->add($where);
			// 同步好友到前台页面（待完善）
			$data=[
				'event'=>'append_social',
				'data'=>[
					'social'=>$has,
					'dev_id'=>$dev_id,
					'soft_id'=>$soft_id,
				]
			];
			\socket\Socket::admin($data,$uid,$dev_id);
		}elseif($has['name']!=$nickname){
			model('social')->edit(['id'=>$has['id'],'name'=>$nickname]);
			$has['nickname']=$nickname;
		}else{
			$has['nickname']=$has['name'];
		}
		return $has;
	}
	/**
	 * 格式化微信消息发送时间支持格式如下
	 * [
  	 *	'周一 18:56',
  	 *	'昨天 12:27',
  	 *	'10:26',
   	 *	'7月29日 下午16:40',
  	 *	'2017年7月29日 下午16:40',
  	 * 	15245486500
	 * ];
	 * @param  string $str 需要格式化的时间字符串
	 * @return integer 时间戳
	 */
	private function wxDateFormat($str=''){
	  if(strlen(intval($str))==strlen($str)){
	    return $str;
	  }
	  return preg_replace_callback('/(\d*年)?(\d*月)?(\d*日)?\s?([\x7f-\xff]*)?(.+[:：].+)?/',function($matches){
	    $date=[];
	    foreach($matches as $k => $v) {
	      if($k===1){
	        $date['y']=empty($v)?date('Y'):intval($v);
	      }elseif($k===2){
	        $date['m']=empty($v)?date('m'):intval($v);
	      }elseif($k===3){
	        $date['d']=empty($v)?date('d'):intval($v);
	      }elseif($k===4){
	        if(!empty($v)){
	          $week=['周日','周一','周二','周三','周四','周五','周六'];
	          $w=array_search($v, $week);
	          $diff=date('w')-$w;
	          if($diff>0){
	            $_time=time()-$diff*86400;
	            $date=[
	              'y'=>date('Y',$_time),
	              'm'=>date('m',$_time),
	              'd'=>date('d',$_time),
	            ];
	          }
	        }
	      }elseif($k===5){
	        $time=strtotime($date['y'].'-'.$date['m'].'-'.$date['d'].' '.trim($v));
	        return $time;
	      }
	    }
	  },$str);
	}
}